/**
 * PanelRegistroNotasAnual.java
 */

 /**
 *  AdSec: Administrador de Secundarias
 *  Copyright (C) 2009 Daniela Ramírez Chaves (dannyrch@gmail.com)
 *  Copyright (C) 2009 Leonel Salazar Valverde (leo87sv@gmail.com)
 *
 *  This file is part of AdSec.
 *  AdSec is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  AdSec is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with AdSec.  If not, see <http://www.gnu.org/licenses/>.
 */

package adsec.presentacion;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Date;
import java.util.Iterator;
import java.util.LinkedList;
import javax.swing.JOptionPane;
import javax.swing.ListSelectionModel;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
import adsec.entidades.Acta;
import adsec.entidades.Docente;
import adsec.entidades.Estado;
import adsec.entidades.GridRegistroNotasAnual;
import adsec.entidades.InfoAnualActa;
import adsec.entidades.MateriaCursada;
import adsec.entidades.Perfil;
import adsec.entidades.Permiso;
import adsec.entidades.Seccion;
import adsec.negocios.AdministradorSeguridad;
import adsec.negocios.ControladoraRegistroNotas;
import adsec.negocios.UtilidadesCapaNegocios;
import org.jdesktop.application.Action;


public class PanelRegistroNotasAnual extends javax.swing.JPanel implements ActionListener, TableModelListener{
    private AdministradorSeguridad adminSeguridad;
    private Permiso permiso;
    private Estado estado;
    private ControladoraRegistroNotas contRegistroNotas;

    private boolean[] puedeEditarColumna = new boolean [] {
        false, false, false, false, false,
        false, false, false, false, false
    };
    /* Aquí se debe almacenar la nota mínima de la materia cursada para la cual 
     * se está insertando o modificando un acta
     */
    private int notaMinima = 100;
    //Número de columna donde se muestra la información de notas
    private final int columnaNotaAnual = 3;
    private final int columnaNotaConv1 = 4;
    private final int columnaEstadoConv1 = 5;
    private final int columnaNotaConv2 = 6;
    private final int columnaEstadoConv2 = 7;
    private final int columnaNotaFinal = 8;
    private final int columnaEstadoFinal = 9;

    private final String stringAprobado = "Aprobado";
    private final String stringReprobado = "Reprobado";
    private final String stringSinAprobar = "Sin aprobar";
    private final String stringConvocatoriaNoAplica = "No aplica";

    private boolean existeActaAnual = false;
    private Acta acta;
    private MateriaCursada materia;
    private InfoAnualActa infoAnualActa;
    private LinkedList<GridRegistroNotasAnual> registroNotas;
    private Docente docente;

    /** Creates new form PanelNivelSeccion */
    public PanelRegistroNotasAnual() {
        initComponents();
        int ancho = gridNotas.getTableHeader().getColumnModel().getTotalColumnWidth();
        gridNotas.getTableHeader().setPreferredSize(new Dimension(ancho, 36));
    }


    private void inicializarRegistroNotasAnual(){
        this.infoAnualActa = new InfoAnualActa();
        this.registroNotas = new LinkedList<GridRegistroNotasAnual>();
        this.adminSeguridad = AdministradorSeguridad.getInstancia();
        this.contRegistroNotas = new ControladoraRegistroNotas();
        this.estado = new Estado();
        this.docente = new Docente();
        this.permiso = this.adminSeguridad.getPermiso(UtilidadesCapaNegocios.moduloRegistroNotas);
        this.habilitarAceptarCancelar(false, false);
        existeActaAnual = existeActaAnual();
        this.notaMinima = this.materia.getNotaMinima();
        this.habilitarColumnasGrid(false);
        if(this.permiso.isConsultar()){
            this.cargarActaAnual();
        }
        
    }//fin de inicializarRegistroNotasAnual

    /*
     * Se debe establecer el Acta que viene con el año, nivel, seccion, su identificador, fecha de creación
     * materia cursada, y cedula del profesor que imparte. Además se debe inicializar la materia, aunque el acta ya la tenga para no
     * consultar el nombre de la materia de nuevo y sus otros atributos.
     */
    public void inicializarDatos(Acta acta, MateriaCursada materia){
        this.acta = acta;
        this.materia = materia;
        this.inicializarRegistroNotasAnual();
    }
    
    private void habilitarBotonesIME(boolean insertar, boolean modificar, boolean eliminar){
        this.btnInsertar.setEnabled(insertar);
        this.btnModificar.setEnabled(modificar);
        this.btnEliminar.setEnabled(eliminar);
    }

    private void habilitarAceptarCancelar(boolean aceptar, boolean cancelar){
        this.btnAceptar.setEnabled(aceptar);
        this.btnCancelar.setEnabled(cancelar);
    }

    private void habilitarColumnasGrid(boolean habilitar){
        this.puedeEditarColumna[columnaNotaConv1] = habilitar;
        this.puedeEditarColumna[columnaNotaConv2] = habilitar;
    }

    private void habilitarCerrarActa(boolean habilitar){
        this.btnCerrarActa.setEnabled(habilitar);
    }

    private void mostrarAbrirActa(){
        this.btnCerrarActa.setText("Abrir Acta");
    }

    /********************************************
     * CARGAR DATOS
     ********************************************/

    private void cargarActaAnual(){
        //Cargamos los datos básicos del acta anual
        this.txtAño.setText(Integer.toString(this.acta.getAnio()));
        this.txtNivel.setText(Integer.toString(this.acta.getNivel()));
        this.txtSeccion.setText(Integer.toString(this.acta.getSeccion()));
        this.txtMateria.setText(this.materia.getNombre());
        Seccion seccion = new Seccion();
        seccion.setAnio(this.acta.getAnio());
        seccion.setNivel(this.acta.getNivel());
        seccion.setSeccion(this.acta.getSeccion());
        docente = this.contRegistroNotas.consultarDatosDocenteImparte(seccion, materia);
        if(existeActaAnual){
            /*Se pueden cargar las notas ya existentes para que
             *queden listas para el modificar
             */
            this.cargarRegistroNotasAnual();
        }//fin de if
        
        this.habilitarBotones();        
    }//fin de cargarActaAnual

    private void habilitarBotones(){
        boolean permisoIME = this.contRegistroNotas.puedeIME(this.adminSeguridad.getUsuario(),
                            this.adminSeguridad.getPerfil(), this.docente.getCedula());
        if(existeActaAnual){

            if( isFechaNula(this.infoAnualActa.getFechaCierre())){
                System.out.println("acta existe y está abierta");
                this.habilitarBotonesIME(false, permisoIME, permisoIME);
                this.habilitarCerrarActa(true);
            }else{
                System.out.println("acta existe y está cerrada");
                this.habilitarBotonesIME(false, false, false);
                //solo el administrador puede reabrir el acta
                if(this.adminSeguridad.getPerfil().getNombre().equals(Perfil.PERFIL_ADMINISTRADOR)){
                    this.mostrarAbrirActa();
                    this.habilitarCerrarActa(true);
                }
            }//fin de else
        }else{
            /*Si el acta anual no existe esperar a que el usuario
             *entre a Insertar para cargar las notas
             */
            System.out.println("acta no existe");
            this.habilitarBotonesIME(permiso.isInsertar(), false, false);
        }
    }//fin de verificarPermisosEstado

    private void cargarCampos(){
        this.txtDocente.setText(docente.getNombre() + " " + docente.getApellidos());
        
        Date fechaCreacion = this.acta.getFecha_creacion();
        Date fechaUltModif = this.infoAnualActa != null ? this.infoAnualActa.getUltima_mod() : UtilidadesCapaNegocios.getFechaNula();
        Date fechaCierre = this.infoAnualActa != null ? this.infoAnualActa.getFechaCierre() : UtilidadesCapaNegocios.getFechaNula();
        this.txtFechaCreacion.setText(!isFechaNula(fechaCreacion) ? UtilidadesCapaNegocios.obtenerStringFechaHora(fechaCreacion) : "");
        this.txtFechaModificacion.setText(!isFechaNula(fechaUltModif)? UtilidadesCapaNegocios.obtenerStringFechaHora(fechaUltModif) :"");
        this.txtFechaCierre.setText(!isFechaNula(fechaCierre)? UtilidadesCapaNegocios.obtenerStringFechaHora(fechaCierre) :"");
        this.txtEstado.setText(isFechaNula(fechaCierre)? "Abierta" : "Cerrada");
        this.txtModificadaPor.setText(this.infoAnualActa.getModificadaPor());
        
        if(!existeActaAnual){
            this.txtEstado.setText("Sin crear");
        }

    }//fin de cargarCampos

    private void cargarRegistroNotasAnual(){
        if(this.estado.getEstadoActual() == Estado.CONSULTAR){
            this.infoAnualActa = this.contRegistroNotas.consultarInfoAnualActa(this.acta.getId_acta());
            this.registroNotas = this.contRegistroNotas.consultarRegistroNotasAnual(this.acta.getId_acta());
        }else{
            //Entonces estamos insertando, consultar las notas no creadas y crear aquí el infoAnualActa
            this.registroNotas = this.contRegistroNotas.consultarRegistroNotasAnualNoCreados(this.acta.getId_acta());
            this.infoAnualActa = new InfoAnualActa();
            this.infoAnualActa.setId_acta(this.acta.getId_acta());
        }
        this.cargarCampos();
        this.llenarGrid();
    }//fin de cargarRegistroNotas

    private void llenarGrid(){
        Iterator<GridRegistroNotasAnual> iterador = registroNotas.iterator();
        while(iterador.hasNext()){
            GridRegistroNotasAnual registro = iterador.next();
            Object arregloDatos[] = new Object[10];
            arregloDatos[0] = registro.getCedula();
            arregloDatos[1] = registro.getNombre();
            arregloDatos[2] = registro.getApellidos();
            arregloDatos[columnaNotaAnual] = registro.getNotaAnual();
            arregloDatos[columnaNotaConv1] = registro.getNotaConv1();
            arregloDatos[columnaNotaConv2] = registro.getNotaConv2();
            
            if(estado.getEstadoActual() == Estado.CONSULTAR){
                arregloDatos[columnaEstadoConv1] = registro.getEstadoConv1();
                arregloDatos[columnaEstadoConv2] = registro.getEstadoConv2();
                arregloDatos[columnaEstadoFinal] = registro.isAprobado()? this.stringAprobado : this.stringReprobado;
            }
            if(estado.getEstadoActual() == Estado.INSERTAR){
                if(registro.getNotaAnual() >= this.notaMinima){
                    registro.setAprobado(true);
                    registro.setNotaFinal(registro.getNotaAnual());
                    arregloDatos[columnaEstadoFinal] = this.stringAprobado;
                    arregloDatos[columnaEstadoConv1] = this.stringConvocatoriaNoAplica;
                    arregloDatos[columnaEstadoConv2] = this.stringConvocatoriaNoAplica;
                }else{
                    arregloDatos[columnaEstadoFinal] = this.stringSinAprobar;
                    arregloDatos[columnaEstadoConv1] = this.stringSinAprobar;
                    arregloDatos[columnaEstadoConv2] = this.stringSinAprobar;
                }//fin de else
            }//fin de if
            arregloDatos[columnaNotaFinal] = registro.getNotaFinal();
            ((DefaultTableModel)this.gridNotas.getModel()).addRow(arregloDatos);
        }//fin de while
    }//fin de llenarGrid
    
    private boolean isFechaNula(Date fecha){
        return UtilidadesCapaNegocios.esFechaNula(fecha);
    }

    /********************************************
     * ACCIONES
     ********************************************/

    private int insertarRegistroNotas(){
        
        int resultado = UtilidadesCapaNegocios.QUERY_ERROR;
        infoAnualActa.setUltima_mod(new Date(System.currentTimeMillis()));
        this.infoAnualActa.setModificadaPor(this.contRegistroNotas.consultarNombreRealUsuarioActual());
        resultado = this.contRegistroNotas.insertarRegistroNotasAnual(infoAnualActa, this.registroNotas);
        
        switch(resultado){
            case UtilidadesCapaNegocios.QUERY_OK:
                this.gridNotas.getSelectionModel().clearSelection();
                JOptionPane.showMessageDialog(null, "Las notas fueron insertadas exitosamente");
                break;
            case UtilidadesCapaNegocios.QUERY_HALF_OK:
                JOptionPane.showMessageDialog(null, "Solo una parte de las notas ha podido ser insertada en el sistema.\n" +
                        "Por favor elimine este conjunto de notas e intente ingresarlas de nuevo al sistema");
                break;
            case UtilidadesCapaNegocios.QUERY_ERROR:
                String mensaje = UtilidadesCapaNegocios.getErrorOperacion(UtilidadesCapaNegocios.moduloRegistroNotas, UtilidadesCapaNegocios.opInsertar);
                JOptionPane.showMessageDialog(null, mensaje, "ERROR",JOptionPane.ERROR_MESSAGE);
                break;
            default:
                break;
        }//fin de switch
        return resultado;
    }//fin de insertarRegistroNotas

    private int modificarRegistroNotas(){
        int resultado = UtilidadesCapaNegocios.QUERY_ERROR;
        infoAnualActa.setUltima_mod(new Date(System.currentTimeMillis()));
        this.infoAnualActa.setModificadaPor(this.contRegistroNotas.consultarNombreRealUsuarioActual());
        resultado = this.contRegistroNotas.modificarRegistroNotasAnual(infoAnualActa, this.registroNotas);

        switch(resultado){
            case UtilidadesCapaNegocios.QUERY_OK:
                this.gridNotas.getSelectionModel().clearSelection();
                JOptionPane.showMessageDialog(null, "Las notas fueron modificadas exitosamente");
                break;
            case UtilidadesCapaNegocios.QUERY_HALF_OK:
                JOptionPane.showMessageDialog(null, "Solo una parte de las notas ha podido ser modificada en el sistema.\n" +
                        "Por favor revise y modifique de nuevo las notas que no fueron actualizadas");
                break;
            case UtilidadesCapaNegocios.QUERY_ERROR:
                String mensaje = UtilidadesCapaNegocios.getErrorOperacion(UtilidadesCapaNegocios.moduloRegistroNotas, UtilidadesCapaNegocios.opModificar);
                JOptionPane.showMessageDialog(null, mensaje, "ERROR",JOptionPane.ERROR_MESSAGE);
                break;
            default:
                break;
        }//fin de switch
        return resultado;
    }//fin de modificarRegistroNotas

    private void eliminarRegistroNotas(){
        int resultado = this.contRegistroNotas.eliminarRegistroNotasAnual(infoAnualActa);
        if(resultado == UtilidadesCapaNegocios.QUERY_OK){
            JOptionPane.showMessageDialog(null, "El registro de notas fue eliminado exitosamente");
            this.volverConsultar();
        }else{
            String mensaje = UtilidadesCapaNegocios.getErrorOperacion(UtilidadesCapaNegocios.moduloRegistroNotas, UtilidadesCapaNegocios.opEliminar);
            JOptionPane.showMessageDialog(null, mensaje, "ERROR",JOptionPane.ERROR_MESSAGE);
        }
    }//fin de eliminarRegistroNotas


    private boolean existeActaAnual(){
        return UtilidadesCapaNegocios.existeLlave(InfoAnualActa.nombreTabla, InfoAnualActa.id_actaNC,
                Integer.toString(this.acta.getId_acta()));
    }//fin de existeActaAnual

    private void volverConsultar(){
        this.estado.setEstadoActual(Estado.CONSULTAR);
        this.habilitarAceptarCancelar(false, false);
        this.habilitarColumnasGrid(false);
        this.limpiarGrid();
        this.limpiarCampos();
        //Con esto lo que hacemos es refrescar los datos y que el usuario
        //los vea actualizados.
        existeActaAnual = existeActaAnual();
        this.cargarActaAnual();
    }//fin de volverConsultar
    
    /********************************************
     * LIMPIAR
     ********************************************/

    private void limpiarCampos(){
        this.txtModificadaPor.setText("");
        this.txtFechaCreacion.setText("");
        this.txtFechaModificacion.setText("");
        this.txtFechaCierre.setText("");
        String estadoActa = (estado.getEstadoActual()==Estado.CONSULTAR)? "": "Sin Crear";
        this.txtEstado.setText(estadoActa);
        this.btnCerrarActa.setText("Cerrar Acta");
    }
    
    private void limpiarGrid(){
        ((DefaultTableModel)this.gridNotas.getModel()).setRowCount(0);
        this.registroNotas.clear();
    }

    /********************************************
     * Validar y verificar datos
     ********************************************/

    private boolean validarDatos(){
        boolean resultado = true;
        for(int fila = 0; fila < this.gridNotas.getModel().getRowCount() && resultado; fila++){
            double nota = Double.valueOf(this.gridNotas.getValueAt(fila, this.columnaNotaAnual).toString());
            if(nota < 0 || nota > 100){
                resultado = false;
            }
        }
        if(!resultado){
            JOptionPane.showMessageDialog(null, "Todas las notas deben estar en el rango de 0 a 100", "ERROR", JOptionPane.WARNING_MESSAGE);
        }
        if(this.acta.getCedula().equals(UtilidadesCapaNegocios.CEDULA_INVALIDA)){
            resultado = false;
            JOptionPane.showMessageDialog(null, "No existe un profesor para la materia y sección elegidas\n" +
                    "o ocurrió un error al consultarlo de la base de datos.\n" +
                    "Por favor verifique que el profesor existe e intente de nuevo.", "ERROR", JOptionPane.ERROR_MESSAGE);
        }
        return resultado;
    }//fin de validarDatos

    /********************************************
     * EVENTOS
     ********************************************/
    public void actionPerformed(ActionEvent evento){
        
    }//fin de actionPerformed

    /* Aquí se hace la corroboración de si la nota de cada
     * convocatoria se puede hacer o no. Así como la colocación de la nota final
     * cuando se edite la nota de la convocatoria.
     */

    public void tableChanged(TableModelEvent evento){
        if( evento.getType() == TableModelEvent.UPDATE){
            this.gridNotas.getModel().removeTableModelListener(this);
            int fila = this.gridNotas.getSelectedRow();
            if( fila >= 0 && fila < this.gridNotas.getRowCount() ){
                DefaultTableModel modelo = (DefaultTableModel)this.gridNotas.getModel();
                boolean aprobadoPorNotaAnual = registroNotas.get(fila).getNotaAnual() >= notaMinima;
                if(evento.getColumn() == this.columnaNotaConv1){
                    if( aprobadoPorNotaAnual ){
                        modelo.setValueAt(0, fila, columnaNotaConv1);
                        JOptionPane.showMessageDialog(this, "Este estudiante ya aprobó la materia", "Error", JOptionPane.ERROR_MESSAGE);
                    }else{
                        this.cambioNotaConvocatoria1(modelo, fila);
                    }
                }//fin de if

                if(evento.getColumn() == this.columnaNotaConv2){
                    if( aprobadoPorNotaAnual || registroNotas.get(fila).getNotaConv1() >= notaMinima){
                        modelo.setValueAt(0, fila, columnaNotaConv2);
                        JOptionPane.showMessageDialog(this, "Este estudiante ya aprobó la materia", "Error", JOptionPane.ERROR_MESSAGE);
                    }else{
                        this.cambioNotaConvocatoria2(modelo, fila);
                    }
                }//fin de if
                this.gridNotas.setModel(modelo);
            }//fin de if

            this.gridNotas.getModel().addTableModelListener(this);
        }//fin de if
    }//fin de tableChanged

    private void cambioNotaConvocatoria1(DefaultTableModel modelo, int fila){
        double notaConv1 = Double.valueOf(modelo.getValueAt(fila, this.columnaNotaConv1).toString());
        if(notaConv1 < 0 || notaConv1 > 100){
            JOptionPane.showMessageDialog(this, "La nota debe estar en el rango de 0-100", "Error", JOptionPane.ERROR_MESSAGE);
            modelo.setValueAt(0, fila, this.columnaNotaAnual);
        }else{
            double notaConv2 = Double.valueOf(modelo.getValueAt(fila, this.columnaNotaConv2).toString());
            boolean aprobado = notaConv1 >= this.notaMinima;
            String estadoConv1 = aprobado ? this.stringAprobado : this.stringReprobado;
            modelo.setValueAt(estadoConv1, fila, this.columnaEstadoConv1);
            if( aprobado ){
                modelo.setValueAt(0, fila, this.columnaNotaConv2);
                modelo.setValueAt(this.stringConvocatoriaNoAplica, fila, this.columnaEstadoConv2);
                modelo.setValueAt(notaMinima, fila, this.columnaNotaFinal);
                modelo.setValueAt(this.stringAprobado, fila, this.columnaEstadoFinal);
            }else{                
                if(notaConv2 < notaMinima){
                    modelo.setValueAt(notaConv1, fila, this.columnaNotaFinal);
                    modelo.setValueAt(this.stringReprobado, fila, this.columnaEstadoFinal);
                }
            }//fin de else
            
            GridRegistroNotasAnual registro = this.registroNotas.get(fila);
            if(fila < this.registroNotas.size()){
                registro.setNotaConv1(notaConv1);
                registro.setEstadoConv1(estadoConv1);
                if( aprobado ){
                    registro.setNotaConv2(0);
                    registro.setEstadoConv2(this.stringConvocatoriaNoAplica);
                    registro.setNotaFinal(notaMinima);
                }else{
                    if(notaConv2 < notaMinima){
                        registro.setNotaFinal(notaConv1);
                    }
                }
                registro.setAprobado( aprobado );
                this.infoAnualActa.setUltima_mod(new Date(System.currentTimeMillis()));
            }//fin de if
        }
    }//fin de cambioNotaConvocatoria1

    private void cambioNotaConvocatoria2(DefaultTableModel modelo, int fila){
        double notaConv2 = Double.valueOf(modelo.getValueAt(fila, this.columnaNotaConv2).toString());
        if(notaConv2 < 0 || notaConv2 > 100){
            JOptionPane.showMessageDialog(this, "La nota debe estar en el rango de 0-100", "Error", JOptionPane.ERROR_MESSAGE);
            modelo.setValueAt(0, fila, this.columnaNotaAnual);
        }else{
            boolean aprobado = notaConv2 >= this.notaMinima;
            String estadoConv2 = aprobado ? this.stringAprobado : this.stringReprobado;
            modelo.setValueAt(estadoConv2, fila, this.columnaEstadoConv2);
            if( aprobado ){
                modelo.setValueAt(notaMinima, fila, this.columnaNotaFinal);
                modelo.setValueAt(this.stringAprobado, fila, this.columnaEstadoFinal);
            }else{
                modelo.setValueAt(notaConv2, fila, this.columnaNotaFinal);
                modelo.setValueAt(this.stringReprobado, fila, this.columnaEstadoFinal);
            }
            GridRegistroNotasAnual registro = this.registroNotas.get(fila);
            if(fila < this.registroNotas.size()){
                registro.setNotaConv2(notaConv2);
                registro.setEstadoConv2(estadoConv2);
                if( aprobado ){
                    registro.setNotaFinal(notaMinima);
                }else{
                    registro.setNotaFinal(notaConv2);
                }
                registro.setAprobado( aprobado );
                this.infoAnualActa.setUltima_mod(new Date(System.currentTimeMillis()));
            }//fin de if
        }
    }//fin de cambioNotaConvocatoria2

    /**
     ** Muestra un mensaje de confirmación para que el usuario decida si realmente
     ** quiere llevar a cabo una operación
     ** @param operacion Código de operación realizada, tomada de UtilidadesCapaNegocios
     ** @param titulo Título a mostrar en el cuadro de confirmación
     ** @return Confirmación: true si el usuario acepta, false en otro caso.
     **/
    private boolean mostrarMensajeConfirmacion(int operacion, String titulo){
        boolean resultado = true;
        String mensaje = UtilidadesCapaNegocios.getMensajeConfirmacion(UtilidadesCapaNegocios.moduloRegistroNotas, operacion);
        int respuesta = JOptionPane.showConfirmDialog(null, mensaje,titulo ,JOptionPane.YES_NO_OPTION,JOptionPane.WARNING_MESSAGE);
        resultado = respuesta == JOptionPane.OK_OPTION;
        return resultado;
    }//fin de mostrarMensajeConfirmacion

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        btnInsertar = new javax.swing.JButton();
        btnModificar = new javax.swing.JButton();
        btnEliminar = new javax.swing.JButton();
        scrollTablaNotas = new javax.swing.JScrollPane();
        gridNotas = new javax.swing.JTable();
        lbAño = new javax.swing.JLabel();
        lbNivel = new javax.swing.JLabel();
        lbMateria = new javax.swing.JLabel();
        lbSeccion = new javax.swing.JLabel();
        lbFechaCreacion = new javax.swing.JLabel();
        txtFechaCreacion = new javax.swing.JTextField();
        lbFechaModificacion = new javax.swing.JLabel();
        txtFechaModificacion = new javax.swing.JTextField();
        lbFechaCierre = new javax.swing.JLabel();
        txtFechaCierre = new javax.swing.JTextField();
        lbEstado = new javax.swing.JLabel();
        txtEstado = new javax.swing.JTextField();
        btnCancelar = new javax.swing.JButton();
        btnAceptar = new javax.swing.JButton();
        btnCerrarActa = new javax.swing.JButton();
        lbModificadadPor = new javax.swing.JLabel();
        txtModificadaPor = new javax.swing.JTextField();
        lbDocente = new javax.swing.JLabel();
        txtDocente = new javax.swing.JTextField();
        txtAño = new javax.swing.JTextField();
        txtNivel = new javax.swing.JTextField();
        txtMateria = new javax.swing.JTextField();
        txtSeccion = new javax.swing.JTextField();

        setMaximumSize(new java.awt.Dimension(700, 693));
        setMinimumSize(new java.awt.Dimension(700, 693));
        setName("Form"); // NOI18N
        setPreferredSize(new java.awt.Dimension(800, 693));
        setRequestFocusEnabled(false);

        javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(adsec.presentacion.LiceoEscazuApp.class).getContext().getActionMap(PanelRegistroNotasAnual.class, this);
        btnInsertar.setAction(actionMap.get("insertandoRegistroNotas")); // NOI18N
        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(adsec.presentacion.LiceoEscazuApp.class).getContext().getResourceMap(PanelRegistroNotasAnual.class);
        btnInsertar.setText(resourceMap.getString("btnInsertar.text")); // NOI18N
        btnInsertar.setName("btnInsertar"); // NOI18N

        btnModificar.setAction(actionMap.get("modificandoRegistroNotas")); // NOI18N
        btnModificar.setText(resourceMap.getString("btnModificar.text")); // NOI18N
        btnModificar.setName("btnModificar"); // NOI18N

        btnEliminar.setAction(actionMap.get("eliminandoRegistroNotas")); // NOI18N
        btnEliminar.setText(resourceMap.getString("btnEliminar.text")); // NOI18N
        btnEliminar.setName("btnEliminar"); // NOI18N

        scrollTablaNotas.setName("scrollTablaNotas"); // NOI18N

        gridNotas.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
            },
            new String [] {
                "Cédula", "Nombre", "Apellidos", "Nota Anual",
                "Convocatoria 1", "<html>Estado<br/>Conv 1</html>",
                "Convocatoria 2", "<html>Estado<br/>Conv 2</html>",
                "Nota Final", "Estado"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.Object.class,
                java.lang.Object.class,
                java.lang.Object.class,
                java.lang.Double.class,
                java.lang.Double.class,
                java.lang.Object.class,
                java.lang.Double.class,
                java.lang.Object.class,
                java.lang.Double.class,
                java.lang.Object.class
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return puedeEditarColumna [columnIndex];
            }
        });
        gridNotas.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_ALL_COLUMNS);
        gridNotas.setAutoscrolls(false);
        gridNotas.setName("gridNotas"); // NOI18N
        gridNotas.getTableHeader().setReorderingAllowed(false);
        scrollTablaNotas.setViewportView(gridNotas);
        gridNotas.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        gridNotas.getModel().addTableModelListener(this);

        lbAño.setText(resourceMap.getString("lbAño.text")); // NOI18N
        lbAño.setName("lbAño"); // NOI18N

        lbNivel.setText(resourceMap.getString("lbNivel.text")); // NOI18N
        lbNivel.setName("lbNivel"); // NOI18N

        lbMateria.setText(resourceMap.getString("lbMateria.text")); // NOI18N
        lbMateria.setName("lbMateria"); // NOI18N

        lbSeccion.setText(resourceMap.getString("lbSeccion.text")); // NOI18N
        lbSeccion.setName("lbSeccion"); // NOI18N

        lbFechaCreacion.setText(resourceMap.getString("lbFechaCreacion.text")); // NOI18N
        lbFechaCreacion.setName("lbFechaCreacion"); // NOI18N

        txtFechaCreacion.setEditable(false);
        txtFechaCreacion.setText(resourceMap.getString("txtFechaCreacion.text")); // NOI18N
        txtFechaCreacion.setName("txtFechaCreacion"); // NOI18N

        lbFechaModificacion.setText(resourceMap.getString("lbFechaModificacion.text")); // NOI18N
        lbFechaModificacion.setName("lbFechaModificacion"); // NOI18N

        txtFechaModificacion.setEditable(false);
        txtFechaModificacion.setText(resourceMap.getString("txtFechaModificacion.text")); // NOI18N
        txtFechaModificacion.setName("txtFechaModificacion"); // NOI18N

        lbFechaCierre.setText(resourceMap.getString("lbFechaCierre.text")); // NOI18N
        lbFechaCierre.setName("lbFechaCierre"); // NOI18N

        txtFechaCierre.setEditable(false);
        txtFechaCierre.setText(resourceMap.getString("txtFechaCierre.text")); // NOI18N
        txtFechaCierre.setName("txtFechaCierre"); // NOI18N

        lbEstado.setText(resourceMap.getString("lbEstado.text")); // NOI18N
        lbEstado.setName("lbEstado"); // NOI18N

        txtEstado.setEditable(false);
        txtEstado.setText(resourceMap.getString("txtEstado.text")); // NOI18N
        txtEstado.setName("txtEstado"); // NOI18N

        btnCancelar.setAction(actionMap.get("accionCancelar")); // NOI18N
        btnCancelar.setText(resourceMap.getString("btnCancelar.text")); // NOI18N
        btnCancelar.setName("btnCancelar"); // NOI18N

        btnAceptar.setAction(actionMap.get("accionAceptar")); // NOI18N
        btnAceptar.setText(resourceMap.getString("btnAceptar.text")); // NOI18N
        btnAceptar.setName("btnAceptar"); // NOI18N

        btnCerrarActa.setAction(actionMap.get("cerrarAbrirActaAnual")); // NOI18N
        btnCerrarActa.setText(resourceMap.getString("btnCerrarActa.text")); // NOI18N
        btnCerrarActa.setName("btnCerrarActa"); // NOI18N

        lbModificadadPor.setText(resourceMap.getString("lbModificadadPor.text")); // NOI18N
        lbModificadadPor.setName("lbModificadadPor"); // NOI18N

        txtModificadaPor.setEditable(false);
        txtModificadaPor.setText(resourceMap.getString("txtModificadaPor.text")); // NOI18N
        txtModificadaPor.setName("txtModificadaPor"); // NOI18N

        lbDocente.setText(resourceMap.getString("lbDocente.text")); // NOI18N
        lbDocente.setName("lbDocente"); // NOI18N

        txtDocente.setEditable(false);
        txtDocente.setText(resourceMap.getString("txtDocente.text")); // NOI18N
        txtDocente.setName("txtDocente"); // NOI18N

        txtAño.setEditable(false);
        txtAño.setText(resourceMap.getString("txtAño.text")); // NOI18N
        txtAño.setName("txtAño"); // NOI18N

        txtNivel.setEditable(false);
        txtNivel.setName("txtNivel"); // NOI18N

        txtMateria.setEditable(false);
        txtMateria.setName("txtMateria"); // NOI18N

        txtSeccion.setEditable(false);
        txtSeccion.setName("txtSeccion"); // NOI18N

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(scrollTablaNotas, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 788, Short.MAX_VALUE)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(btnInsertar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(btnModificar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(btnEliminar))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(btnCerrarActa)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnAceptar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnCancelar))
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(lbSeccion)
                            .addComponent(lbMateria)
                            .addComponent(lbNivel)
                            .addComponent(lbAño)
                            .addComponent(lbModificadadPor)
                            .addComponent(lbEstado)
                            .addComponent(lbDocente))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(txtMateria, javax.swing.GroupLayout.PREFERRED_SIZE, 209, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(txtNivel, javax.swing.GroupLayout.PREFERRED_SIZE, 66, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(txtAño, javax.swing.GroupLayout.PREFERRED_SIZE, 66, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(txtSeccion, javax.swing.GroupLayout.PREFERRED_SIZE, 64, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGroup(layout.createSequentialGroup()
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                    .addComponent(txtModificadaPor)
                                    .addComponent(txtDocente, javax.swing.GroupLayout.Alignment.LEADING)
                                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                                        .addComponent(txtEstado, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addGap(12, 12, 12)
                                        .addComponent(lbFechaCreacion)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(txtFechaCreacion, javax.swing.GroupLayout.PREFERRED_SIZE, 124, javax.swing.GroupLayout.PREFERRED_SIZE)))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                    .addComponent(lbFechaModificacion)
                                    .addComponent(lbFechaCierre))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                    .addComponent(txtFechaModificacion)
                                    .addComponent(txtFechaCierre, javax.swing.GroupLayout.DEFAULT_SIZE, 126, Short.MAX_VALUE))))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 70, Short.MAX_VALUE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(btnEliminar)
                            .addComponent(btnModificar)
                            .addComponent(btnInsertar))
                        .addGap(30, 30, 30)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(lbAño)
                            .addComponent(txtAño, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(lbNivel)
                            .addComponent(txtNivel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(lbMateria)
                            .addComponent(txtMateria, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(lbSeccion))
                    .addComponent(txtSeccion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                    .addComponent(lbDocente)
                    .addComponent(txtDocente, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                    .addComponent(lbEstado)
                    .addComponent(txtEstado, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lbFechaCreacion)
                    .addComponent(txtFechaCreacion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(txtFechaCierre, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lbFechaCierre))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                    .addComponent(txtModificadaPor, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lbModificadadPor)
                    .addComponent(lbFechaModificacion)
                    .addComponent(txtFechaModificacion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addComponent(scrollTablaNotas, javax.swing.GroupLayout.PREFERRED_SIZE, 351, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnCancelar)
                    .addComponent(btnAceptar)
                    .addComponent(btnCerrarActa))
                .addContainerGap(31, Short.MAX_VALUE))
        );
    }// </editor-fold>//GEN-END:initComponents


    @Action
    public void insertandoRegistroNotas() {
        this.estado.setEstadoActual(Estado.INSERTAR);
        this.habilitarAceptarCancelar(true, true);
        this.habilitarBotonesIME(false, false, false);
        this.limpiarGrid();
        this.habilitarColumnasGrid(true);
        this.cargarRegistroNotasAnual();
    }

    @Action
    public void modificandoRegistroNotas() {
        this.estado.setEstadoActual(Estado.MODIFICAR);
        this.habilitarAceptarCancelar(true, true);
        this.habilitarBotonesIME(false, false, false);
        //this.habilitarCamposTexto(false);
        this.habilitarColumnasGrid(true);
    }

    @Action
    public void accionAceptar() {
        Animador.animar();
        switch(estado.getEstadoActual()){
            case Estado.INSERTAR:
                if(mostrarMensajeConfirmacion(UtilidadesCapaNegocios.opInsertar, "INSERTAR") ){
                    if( validarDatos()){
                        this.insertarRegistroNotas();
                        this.volverConsultar();
                    }
                }
            break;
            case Estado.MODIFICAR:
                if(mostrarMensajeConfirmacion(UtilidadesCapaNegocios.opModificar, "MODIFICAR") ){
                    if(validarDatos()){
                        this.modificarRegistroNotas();
                        this.volverConsultar();
                    }
                }
            break;
        }
        Animador.detenerAnimacion();
    }//fin de accionAceptar

    @Action
    public void accionCancelar() {
        this.limpiarCampos();
        this.limpiarGrid();
        this.volverConsultar();
    }//fin de accionCancelar

    @Action
    public void eliminandoRegistroNotas() {
        Animador.animar();
        if(this.mostrarMensajeConfirmacion(UtilidadesCapaNegocios.opEliminar, "ELIMINAR")){
            this.eliminarRegistroNotas();
        }
        Animador.detenerAnimacion();
    }//fin de eliminandoRegistroNotas

    @Action
    public void cerrarAbrirActaAnual() {
        int operacion = UtilidadesCapaNegocios.opCerrarActa;
        String accion = "Cerrar";
        if(txtEstado.getText().equals("Cerrada")){
            operacion = UtilidadesCapaNegocios.opAbrirActa;
            accion = "Abrir";
        }
        boolean resultado = this.mostrarMensajeConfirmacion(operacion, accion + " acta");
        if(resultado){
            if(estado.getEstadoActual() == Estado.MODIFICAR){
                resultado = this.modificarRegistroNotas() == UtilidadesCapaNegocios.QUERY_OK;
            }

            if(estado.getEstadoActual() == Estado.INSERTAR){
                resultado = this.insertarRegistroNotas() == UtilidadesCapaNegocios.QUERY_OK;
            }
            if(resultado){
                int resultadoCierreAbrir = contRegistroNotas.cerrarAbrirActaAnual(infoAnualActa.getId_info_anual_acta(), operacion);
                if(UtilidadesCapaNegocios.QUERY_OK == resultadoCierreAbrir){
                    //Se coloca el estado el estado actual modificar para refrescar los datos.
                    this.estado.setEstadoActual(Estado.MODIFICAR);
                    this.volverConsultar();
                }else{
                    JOptionPane.showMessageDialog(null, "Ocurrió un problema al " + accion + " el acta por favor intente de nuevo","ERROR: " + accion + " Acta", JOptionPane.ERROR_MESSAGE);
                }
            }
        }
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnAceptar;
    private javax.swing.JButton btnCancelar;
    private javax.swing.JButton btnCerrarActa;
    private javax.swing.JButton btnEliminar;
    private javax.swing.JButton btnInsertar;
    private javax.swing.JButton btnModificar;
    private javax.swing.JTable gridNotas;
    private javax.swing.JLabel lbAño;
    private javax.swing.JLabel lbDocente;
    private javax.swing.JLabel lbEstado;
    private javax.swing.JLabel lbFechaCierre;
    private javax.swing.JLabel lbFechaCreacion;
    private javax.swing.JLabel lbFechaModificacion;
    private javax.swing.JLabel lbMateria;
    private javax.swing.JLabel lbModificadadPor;
    private javax.swing.JLabel lbNivel;
    private javax.swing.JLabel lbSeccion;
    private javax.swing.JScrollPane scrollTablaNotas;
    private javax.swing.JTextField txtAño;
    private javax.swing.JTextField txtDocente;
    private javax.swing.JTextField txtEstado;
    private javax.swing.JTextField txtFechaCierre;
    private javax.swing.JTextField txtFechaCreacion;
    private javax.swing.JTextField txtFechaModificacion;
    private javax.swing.JTextField txtMateria;
    private javax.swing.JTextField txtModificadaPor;
    private javax.swing.JTextField txtNivel;
    private javax.swing.JTextField txtSeccion;
    // End of variables declaration//GEN-END:variables

}
